package wechat

import (
	"fmt"
	"strconv"
	"sync"
)

type WxErr struct {
	ErrCode float64 `json:"errcode"`
	ErrMsg  string  `json:"errmsg"`
	MsgId   float64 `json:"msgid"`
}

// 自动返回错误信息
func (w WxErr) Error() string {
	wxErrMsg := GeWxErrMsgInstance()
	return fmt.Sprintf("errCode:%d errMsg:%s errMsgMeaning:%s", int64(w.ErrCode), w.ErrMsg, wxErrMsg.getErrMsg(strconv.FormatInt(int64(w.ErrCode), 10)))
}

func NewWxErr(errCode float64, errMsg string, msgId float64) WxErr {
	wxErr := WxErr{
		ErrCode: errCode,
		ErrMsg:  errMsg,
		MsgId:   msgId,
	}
	return wxErr
}

var once sync.Once
var wxErrMsg *WxErrMsg

type WxErrMsg struct {
	msgMap map[string]string
}

func GeWxErrMsgInstance() *WxErrMsg {
	once.Do(func() {
		if wxErrMsg == nil {
			wxErrMsg = new(WxErrMsg)
			wxErrMsg.msgMap = generateErrMsgMap()
		}
	})
	return wxErrMsg
}
func (wm WxErrMsg) getErrMsg(code string) string {
	value, exist := wm.msgMap["code"]
	if exist {
		return value
	}
	return ""
}
func generateErrMsgMap() map[string]string {
	result := make(map[string]string)
	result["-1"] = "系统繁忙，此时请开发者稍候再试"
	result["0"] = "请求成功"
	result["40001"] = "AppSecret错误或者AppSecret不属于这个公众号，请开发者确认AppSecret的正确性"
	result["40002"] = "请确保grant_type字段值为client_credential"
	result["40003"] = "传入非法的openid"
	result["40004"] = "无效的media类型"
	result["40005"] = "不支持的媒体类型"
	result["40009"] = "媒体文件长度不合法"
	result["40032"] = "每次传入的openid列表个数不能超过50个"
	result["40164"] = "调用接口的IP地址不在白名单中，请在接口IP白名单中进行设置。（小程序及小游戏调用不要求IP地址在白名单内。）"
	result["41001"] = "encodingAesKey 非法"
	result["41002"] = "iv 非法"
	result["41003"] = "aes 解密失败"
	result["41004"] = "解密后得到的buffer非法"
	result["41005"] = "base64加密失败"
	result["41016"] = "base64解密失败"
	result["45059"] = "有粉丝身上的标签数已经超过限制，即超过20个"
	result["45159"] = "非法的tag_id"
	result["49003"] = "传入的openid不属于此AppID"
	result["65400"] = "API不可用，即没有开通/升级到新版客服功能"
	result["65401"] = "无效客服帐号"
	result["65402"] = "客服帐号尚未绑定微信号，不能投入使用"
	result["65403"] = "客服昵称不合法"
	result["65404"] = "客服帐号不合法"
	result["65405"] = "帐号数目已达到上限，不能继续添加"
	result["65406"] = "已经存在的客服帐号"
	result["65407"] = "邀请对象已经是该公众号客服"
	result["65408"] = "本公众号已经有一个邀请给该微信"
	result["65409"] = "无效的微信号"
	result["65410"] = "邀请对象绑定公众号客服数达到上限（目前每个微信号可以绑定5个公众号客服帐号）"
	result["65411"] = "该帐号已经有一个等待确认的邀请，不能重复邀请"
	result["65412"] = "该帐号已经绑定微信号，不能进行邀请"
	result["65413"] = "不存在对应用户的会话信息"
	result["65414"] = "粉丝正在被其他客服接待"
	result["65415"] = "指定的客服不在线"
	result["89503"] = "此IP调用需要管理员确认,请联系管理员"
	result["89501"] = "此IP正在等待管理员确认,请联系管理员"
	result["89506"] = "24小时内该IP被管理员拒绝调用两次，24小时内不可再使用该IP调用"
	result["89507"] = "1小时内该IP被管理员拒绝调用一次，1小时内不可再使用该IP调用"
	result["0"] = "请求成功"
	return result
}
